package com.manjusaka.behavior11.Mediator;

/**
 * Created by alan.manjusaka on 2017/7/11.
 * 中介者设计模式的主要作用就是用来协调多个对象的交互，
 * eg:多个对象之间是如何交互的，如果一个对象改变后，另一个对象也需要做出相应的改变
 * eg:点击按钮的时候，文本框会显示文字，图片框会显示图片； 点击文本框的时候，按钮会变颜色，图片框会显示图片......
 * eg:如果再点击按钮的时候将文本框显示和图片框显示放入的话，那么在增加其他的东西的时后，需要更改这三个类的代码，违反了设计模式的开闭原则
 * ，如何解决这个问题：还是引用的方法来进行互相的引用和操作看如下代码的实现
 */
public class MediatorPattern {
    public static void main(String[] args) {
        Mediator Mediator = new Mediator();
        Button Button = new Button();
        List List = new List();
        ComboBox ComboBox = new ComboBox();

        Mediator.setButton(Button);
        Mediator.setList(List);
        Mediator.setComboBox(ComboBox);

        Button.setMediator(Mediator);
        List.setMediator(Mediator);
        ComboBox.setMediator(Mediator);

        List.change();

    }

}

/**
 * Mediator 中介者/调节者的抽象类   ConcreteMediator具体的调节者
 * <p>
 * Button 按钮类   ComboBox 组合框类   List列表框类
 */
class Mediator {
    //方法的定义和参数的定义
    private Button Button;
    private ComboBox ComboBox;
    private List List;

    public void setButton(com.manjusaka.behavior11.Mediator.Button button) {
        Button = button;
    }

    public void setComboBox(com.manjusaka.behavior11.Mediator.ComboBox comboBox) {
        ComboBox = comboBox;
    }

    public void setList(com.manjusaka.behavior11.Mediator.List list) {
        List = list;
    }

    public void changeComponent(Component component) {
        if (component instanceof Button) {
            //点击按钮、
            ComboBox.update();
            List.update();

        } else if (component instanceof ComboBox) {
            //点击复选框
            ComboBox.update();
            List.update();

        } else if (component instanceof List) {
            //点击文本框
            Button.update();
            ComboBox.update();
        }

    }
}


abstract class Component {
    protected Mediator Mediator;

    public void setMediator(com.manjusaka.behavior11.Mediator.Mediator mediator) {
        Mediator = mediator;
    }

    public void change() {
        Mediator.changeComponent(this);
    }

    public abstract void update();
}

class Button extends Component {
    public void update() {
        System.out.println("按钮增加一项：周芷若。");
    }
}

class ComboBox extends Component {
    public void update() {
        System.out.println("组合框增加一项：赵敏。");
    }

}

class List extends Component {
    public void update() {
        System.out.println("列表框增加一项：张无忌。");
    }

}